package converthelp

import (
	"fmt"
	"math"
	"math/big"
	"strconv"
)

// Float64ToStr float64转字符串，位数不足填充0
func Float64ToStr(f float64, decimal int) string {
	return strconv.FormatFloat(f, 'f', decimal, 64)
}

// Float64ToStrTrim float64转字符串，仅保留有效位数--主要逻辑就是先乘，trunc之后再除回去，就达到了保留N位小数的效果
func Float64ToStrTrim(num float64, decimal int) string {
	// 默认乘1
	d := float64(1)
	if decimal > 0 {
		// 10的N次方
		d = math.Pow10(decimal)
	}
	// math.trunc作用就是返回浮点数的整数部分
	// 再除回去，小数点后无效的0也就不存在了
	return strconv.FormatFloat(math.Trunc(num*d)/d, 'f', -1, 64)
}

// Float64KeepDecimal 保留小数位----这个方法效率高
// 如需要转化的数值已经是一个 很大的浮点型数字，这时候再乘以精度范围值， 可能会产生 溢出
// 参数decimal：保留的位数
func Float64KeepDecimal(f float64, decimal int) float64 {
	ratio := math.Pow(10, float64(decimal))
	return math.Round(f*ratio) / ratio
}

// Float64KeepDecimal2 保留小数位
// 参数decimal：保留的位数
func Float64KeepDecimal2(f float64, decimal int) float64 {
	ft := "%." + strconv.Itoa(decimal) + "f"
	f, _ = strconv.ParseFloat(fmt.Sprintf(ft, f), 64)
	return f
}

func AnyToFloat64(i any) float64 {
	switch v := i.(type) {
	case string:
		f, _ := strconv.ParseFloat(v, 64)
		return f
	case float64:
		return v
	case int:
		return float64(v)
	case int32:
		return float64(v)
	case int64:
		return float64(v)
	case float32:
		return float64(v)
	case *big.Float:
		f, _ := v.Float64()
		return f
	case big.Float:
		f, _ := v.Float64()
		return f
	}
	return 0
}

func AnyToInt64(i interface{}) int64 {
	switch v := i.(type) {
	case string:
		re, _ := strconv.ParseInt(v, 10, 64)
		return re
	case int:
		return int64(v)
	case int32:
		return int64(v)
	case int64:
		return v
	case big.Int:
		return v.Int64()
	case *big.Int:
		return v.Int64()
	}
	return 0
}
